home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / swingall.jar / javax / swing / plaf / basic / BasicTabbedPaneUI.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-07-15  |  22.6 KB  |  1,018 lines

  1. package javax.swing.plaf.basic;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Component;
  5. import java.awt.Container;
  6. import java.awt.Dimension;
  7. import java.awt.Font;
  8. import java.awt.FontMetrics;
  9. import java.awt.Graphics;
  10. import java.awt.Insets;
  11. import java.awt.LayoutManager;
  12. import java.awt.Rectangle;
  13. import java.awt.Toolkit;
  14. import java.awt.event.ContainerListener;
  15. import java.awt.event.FocusListener;
  16. import java.awt.event.MouseListener;
  17. import java.beans.PropertyChangeListener;
  18. import java.util.Vector;
  19. import javax.swing.Icon;
  20. import javax.swing.JComponent;
  21. import javax.swing.JTabbedPane;
  22. import javax.swing.KeyStroke;
  23. import javax.swing.LookAndFeel;
  24. import javax.swing.SwingConstants;
  25. import javax.swing.SwingUtilities;
  26. import javax.swing.UIManager;
  27. import javax.swing.event.ChangeListener;
  28. import javax.swing.plaf.ComponentUI;
  29. import javax.swing.plaf.TabbedPaneUI;
  30. import javax.swing.text.View;
  31.  
  32. public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants {
  33.    protected JTabbedPane tabPane;
  34.    protected Color highlight;
  35.    protected Color lightHighlight;
  36.    protected Color shadow;
  37.    protected Color darkShadow;
  38.    protected Color focus;
  39.    protected int textIconGap;
  40.    protected int tabRunOverlay;
  41.    protected Insets tabInsets;
  42.    protected Insets selectedTabPadInsets;
  43.    protected Insets tabAreaInsets;
  44.    protected Insets contentBorderInsets;
  45.    protected KeyStroke upKey;
  46.    protected KeyStroke downKey;
  47.    protected KeyStroke leftKey;
  48.    protected KeyStroke rightKey;
  49.    private KeyStroke kpUpKey;
  50.    private KeyStroke kpDownKey;
  51.    private KeyStroke kpLeftKey;
  52.    private KeyStroke kpRightKey;
  53.    protected int[] tabRuns = new int[10];
  54.    protected int runCount;
  55.    protected int selectedRun;
  56.    protected Rectangle[] rects = new Rectangle[0];
  57.    protected int maxTabHeight;
  58.    protected int maxTabWidth;
  59.    protected ChangeListener tabChangeListener;
  60.    protected PropertyChangeListener propertyChangeListener;
  61.    protected MouseListener mouseListener;
  62.    protected FocusListener focusListener;
  63.    private ContainerListener containerListener;
  64.    private Insets currentPadInsets = new Insets(0, 0, 0, 0);
  65.    private Insets currentTabAreaInsets = new Insets(0, 0, 0, 0);
  66.    private Component visibleComponent;
  67.    private Vector htmlViews;
  68.  
  69.    // $FF: synthetic method
  70.    static Vector access$0(BasicTabbedPaneUI var0) {
  71.       return var0.htmlViews;
  72.    }
  73.  
  74.    // $FF: synthetic method
  75.    static Vector access$1(BasicTabbedPaneUI var0) {
  76.       return var0.createHTMLVector();
  77.    }
  78.  
  79.    // $FF: synthetic method
  80.    static void access$2(BasicTabbedPaneUI var0, Vector var1) {
  81.       var0.htmlViews = var1;
  82.    }
  83.  
  84.    protected void assureRectsCreated(int var1) {
  85.       int var2 = this.rects.length;
  86.       if (var1 != var2) {
  87.          Rectangle[] var3 = new Rectangle[var1];
  88.          System.arraycopy(this.rects, 0, var3, 0, Math.min(var2, var1));
  89.          this.rects = var3;
  90.  
  91.          for(int var4 = var2; var4 < var1; ++var4) {
  92.             this.rects[var4] = new Rectangle();
  93.          }
  94.       }
  95.  
  96.    }
  97.  
  98.    protected int calculateMaxTabHeight(int var1) {
  99.       FontMetrics var2 = this.getFontMetrics();
  100.       int var3 = this.tabPane.getTabCount();
  101.       int var4 = 0;
  102.       int var5 = var2.getHeight();
  103.  
  104.       for(int var6 = 0; var6 < var3; ++var6) {
  105.          var4 = Math.max(this.calculateTabHeight(var1, var6, var5), var4);
  106.       }
  107.  
  108.       return var4;
  109.    }
  110.  
  111.    protected int calculateMaxTabWidth(int var1) {
  112.       FontMetrics var2 = this.getFontMetrics();
  113.       int var3 = this.tabPane.getTabCount();
  114.       int var4 = 0;
  115.  
  116.       for(int var5 = 0; var5 < var3; ++var5) {
  117.          var4 = Math.max(this.calculateTabWidth(var1, var5, var2), var4);
  118.       }
  119.  
  120.       return var4;
  121.    }
  122.  
  123.    protected int calculateTabAreaHeight(int var1, int var2, int var3) {
  124.       Insets var4 = this.getTabAreaInsets(var1);
  125.       int var5 = this.getTabRunOverlay(var1);
  126.       return var2 > 0 ? var2 * (var3 - var5) + var5 + var4.top + var4.bottom : 0;
  127.    }
  128.  
  129.    protected int calculateTabAreaWidth(int var1, int var2, int var3) {
  130.       Insets var4 = this.getTabAreaInsets(var1);
  131.       int var5 = this.getTabRunOverlay(var1);
  132.       return var2 > 0 ? var2 * (var3 - var5) + var5 + var4.left + var4.right : 0;
  133.    }
  134.  
  135.    protected int calculateTabHeight(int var1, int var2, int var3) {
  136.       int var4 = 0;
  137.       View var5;
  138.       if (this.htmlViews != null && (var5 = (View)this.htmlViews.elementAt(var2)) != null) {
  139.          var4 += (int)var5.getPreferredSpan(1);
  140.       } else {
  141.          var4 += var3;
  142.       }
  143.  
  144.       Icon var6 = this.getIconForTab(var2);
  145.       Insets var7 = this.getTabInsets(var1, var2);
  146.       if (var6 != null) {
  147.          var4 = Math.max(var4, var6.getIconHeight());
  148.       }
  149.  
  150.       var4 += var7.top + var7.bottom + 2;
  151.       return var4;
  152.    }
  153.  
  154.    protected int calculateTabWidth(int var1, int var2, FontMetrics var3) {
  155.       Icon var4 = this.getIconForTab(var2);
  156.       Insets var5 = this.getTabInsets(var1, var2);
  157.       int var6 = var5.left + var5.right + 3;
  158.       if (var4 != null) {
  159.          var6 += var4.getIconWidth() + this.textIconGap;
  160.       }
  161.  
  162.       View var7;
  163.       if (this.htmlViews != null && (var7 = (View)this.htmlViews.elementAt(var2)) != null) {
  164.          var6 += (int)var7.getPreferredSpan(0);
  165.       } else {
  166.          String var8 = this.tabPane.getTitleAt(var2);
  167.          var6 += SwingUtilities.computeStringWidth(var3, var8);
  168.       }
  169.  
  170.       return var6;
  171.    }
  172.  
  173.    protected ChangeListener createChangeListener() {
  174.       return new TabSelectionHandler(this);
  175.    }
  176.  
  177.    protected FocusListener createFocusListener() {
  178.       return new FocusHandler(this);
  179.    }
  180.  
  181.    private Vector createHTMLVector() {
  182.       Vector var1 = new Vector();
  183.       int var2 = this.tabPane.getTabCount();
  184.       if (var2 > 0) {
  185.          for(int var3 = 0; var3 < var2; ++var3) {
  186.             String var4 = this.tabPane.getTitleAt(var3);
  187.             if (BasicHTML.isHTMLString(var4)) {
  188.                var1.addElement(BasicHTML.createHTMLView(this.tabPane, var4));
  189.             } else {
  190.                var1.addElement((Object)null);
  191.             }
  192.          }
  193.       }
  194.  
  195.       return var1;
  196.    }
  197.  
  198.    protected LayoutManager createLayoutManager() {
  199.       return new TabbedPaneLayout(this);
  200.    }
  201.  
  202.    protected MouseListener createMouseListener() {
  203.       return new MouseHandler(this);
  204.    }
  205.  
  206.    protected PropertyChangeListener createPropertyChangeListener() {
  207.       return new PropertyChangeHandler(this);
  208.    }
  209.  
  210.    public static ComponentUI createUI(JComponent var0) {
  211.       return new BasicTabbedPaneUI();
  212.    }
  213.  
  214.    private void ensureCurrentLayout() {
  215.       if (this.tabPane.getTabCount() != this.rects.length) {
  216.          TabbedPaneLayout var1 = (TabbedPaneLayout)this.tabPane.getLayout();
  217.          var1.calculateLayoutInfo();
  218.       }
  219.  
  220.    }
  221.  
  222.    protected void expandTabRunsArray() {
  223.       int var1 = this.tabRuns.length;
  224.       int[] var2 = new int[var1 + 10];
  225.       System.arraycopy(this.tabRuns, 0, var2, 0, this.runCount);
  226.       this.tabRuns = var2;
  227.    }
  228.  
  229.    protected Insets getContentBorderInsets(int var1) {
  230.       return this.contentBorderInsets;
  231.    }
  232.  
  233.    protected FontMetrics getFontMetrics() {
  234.       Font var1 = this.tabPane.getFont();
  235.       return Toolkit.getDefaultToolkit().getFontMetrics(var1);
  236.    }
  237.  
  238.    protected Icon getIconForTab(int var1) {
  239.       return (!this.tabPane.isEnabled() || !this.tabPane.isEnabledAt(var1)) && this.tabPane.getDisabledIconAt(var1) != null ? this.tabPane.getDisabledIconAt(var1) : this.tabPane.getIconAt(var1);
  240.    }
  241.  
  242.    public Dimension getMaximumSize(JComponent var1) {
  243.       return null;
  244.    }
  245.  
  246.    public Dimension getMinimumSize(JComponent var1) {
  247.       return null;
  248.    }
  249.  
  250.    protected int getNextTabIndex(int var1) {
  251.       return (var1 + 1) % this.tabPane.getTabCount();
  252.    }
  253.  
  254.    public Dimension getPreferredSize(JComponent var1) {
  255.       return null;
  256.    }
  257.  
  258.    protected int getPreviousTabIndex(int var1) {
  259.       int var2 = var1 - 1 >= 0 ? var1 - 1 : this.tabPane.getTabCount() - 1;
  260.       return var2 >= 0 ? var2 : 0;
  261.    }
  262.  
  263.    protected int getRunForTab(int var1, int var2) {
  264.       for(int var3 = 0; var3 < this.runCount; ++var3) {
  265.          int var4 = this.tabRuns[var3];
  266.          int var5 = this.lastTabInRun(var1, var3);
  267.          if (var2 >= var4 && var2 <= var5) {
  268.             return var3;
  269.          }
  270.       }
  271.  
  272.       return 0;
  273.    }
  274.  
  275.    protected Insets getSelectedTabPadInsets(int var1) {
  276.       rotateInsets(this.selectedTabPadInsets, this.currentPadInsets, var1);
  277.       return this.currentPadInsets;
  278.    }
  279.  
  280.    protected Insets getTabAreaInsets(int var1) {
  281.       rotateInsets(this.tabAreaInsets, this.currentTabAreaInsets, var1);
  282.       return this.currentTabAreaInsets;
  283.    }
  284.  
  285.    public Rectangle getTabBounds(JTabbedPane var1, int var2) {
  286.       this.ensureCurrentLayout();
  287.       return new Rectangle(this.rects[var2]);
  288.    }
  289.  
  290.    protected Insets getTabInsets(int var1, int var2) {
  291.       return this.tabInsets;
  292.    }
  293.  
  294.    protected int getTabLabelShiftX(int var1, int var2, boolean var3) {
  295.       Rectangle var4 = this.rects[var2];
  296.       int var5 = 0;
  297.       switch (var1) {
  298.          case 1:
  299.          case 3:
  300.          default:
  301.             var5 = var4.width % 2;
  302.             break;
  303.          case 2:
  304.             var5 = var3 ? -1 : 1;
  305.             break;
  306.          case 4:
  307.             var5 = var3 ? 1 : -1;
  308.       }
  309.  
  310.       return var5;
  311.    }
  312.  
  313.    protected int getTabLabelShiftY(int var1, int var2, boolean var3) {
  314.       Rectangle var4 = this.rects[var2];
  315.       int var5 = 0;
  316.       switch (var1) {
  317.          case 1:
  318.          default:
  319.             var5 = var3 ? -1 : 1;
  320.             break;
  321.          case 2:
  322.          case 4:
  323.             var5 = var4.height % 2;
  324.             break;
  325.          case 3:
  326.             var5 = var3 ? 1 : -1;
  327.       }
  328.  
  329.       return var5;
  330.    }
  331.  
  332.    public int getTabRunCount(JTabbedPane var1) {
  333.       return this.runCount;
  334.    }
  335.  
  336.    protected int getTabRunIndent(int var1, int var2) {
  337.       return 0;
  338.    }
  339.  
  340.    protected int getTabRunOffset(int var1, int var2, int var3, boolean var4) {
  341.       int var5 = this.getRunForTab(var2, var3);
  342.       int var6;
  343.       switch (var1) {
  344.          case 1:
  345.          default:
  346.             if (var5 == 0) {
  347.                var6 = var4 ? -(this.calculateTabAreaHeight(var1, this.runCount, this.maxTabHeight) - this.maxTabHeight) : -this.maxTabHeight;
  348.             } else if (var5 == this.runCount - 1) {
  349.                var6 = var4 ? this.maxTabHeight : this.calculateTabAreaHeight(var1, this.runCount, this.maxTabHeight) - this.maxTabHeight;
  350.             } else {
  351.                var6 = var4 ? this.maxTabHeight : -this.maxTabHeight;
  352.             }
  353.             break;
  354.          case 2:
  355.             if (var5 == 0) {
  356.                var6 = var4 ? -(this.calculateTabAreaWidth(var1, this.runCount, this.maxTabWidth) - this.maxTabWidth) : -this.maxTabWidth;
  357.             } else if (var5 == this.runCount - 1) {
  358.                var6 = var4 ? this.maxTabWidth : this.calculateTabAreaWidth(var1, this.runCount, this.maxTabWidth) - this.maxTabWidth;
  359.             } else {
  360.                var6 = var4 ? this.maxTabWidth : -this.maxTabWidth;
  361.             }
  362.             break;
  363.          case 3:
  364.             if (var5 == 0) {
  365.                var6 = var4 ? this.maxTabHeight : this.calculateTabAreaHeight(var1, this.runCount, this.maxTabHeight) - this.maxTabHeight;
  366.             } else if (var5 == this.runCount - 1) {
  367.                var6 = var4 ? -(this.calculateTabAreaHeight(var1, this.runCount, this.maxTabHeight) - this.maxTabHeight) : -this.maxTabHeight;
  368.             } else {
  369.                var6 = var4 ? this.maxTabHeight : -this.maxTabHeight;
  370.             }
  371.             break;
  372.          case 4:
  373.             if (var5 == 0) {
  374.                var6 = var4 ? this.maxTabWidth : this.calculateTabAreaWidth(var1, this.runCount, this.maxTabWidth) - this.maxTabWidth;
  375.             } else if (var5 == this.runCount - 1) {
  376.                var6 = var4 ? -(this.calculateTabAreaWidth(var1, this.runCount, this.maxTabWidth) - this.maxTabWidth) : -this.maxTabWidth;
  377.             } else {
  378.                var6 = var4 ? this.maxTabWidth : -this.maxTabWidth;
  379.             }
  380.       }
  381.  
  382.       return var6;
  383.    }
  384.  
  385.    protected int getTabRunOverlay(int var1) {
  386.       return this.tabRunOverlay;
  387.    }
  388.  
  389.    protected Component getVisibleComponent() {
  390.       return this.visibleComponent;
  391.    }
  392.  
  393.    protected void installDefaults() {
  394.       LookAndFeel.installColorsAndFont(this.tabPane, "TabbedPane.background", "TabbedPane.foreground", "TabbedPane.font");
  395.       this.highlight = UIManager.getColor("TabbedPane.highlight");
  396.       this.lightHighlight = UIManager.getColor("TabbedPane.lightHighlight");
  397.       this.shadow = UIManager.getColor("TabbedPane.shadow");
  398.       this.darkShadow = UIManager.getColor("TabbedPane.darkShadow");
  399.       this.focus = UIManager.getColor("TabbedPane.focus");
  400.       this.textIconGap = UIManager.getInt("TabbedPane.textIconGap");
  401.       this.tabInsets = UIManager.getInsets("TabbedPane.tabInsets");
  402.       this.selectedTabPadInsets = UIManager.getInsets("TabbedPane.selectedTabPadInsets");
  403.       this.tabAreaInsets = UIManager.getInsets("TabbedPane.tabAreaInsets");
  404.       this.contentBorderInsets = UIManager.getInsets("TabbedPane.contentBorderInsets");
  405.       this.tabRunOverlay = UIManager.getInt("TabbedPane.tabRunOverlay");
  406.    }
  407.  
  408.    protected void installKeyboardActions() {
  409.       RightAction var1 = new RightAction(this);
  410.       LeftAction var2 = new LeftAction(this);
  411.       UpAction var3 = new UpAction(this);
  412.       DownAction var4 = new DownAction(this);
  413.       PageUpAction var5 = new PageUpAction(this);
  414.       PageDownAction var6 = new PageDownAction(this);
  415.       RequestFocusAction var7 = new RequestFocusAction(this);
  416.       RequestFocusForVisibleAction var8 = new RequestFocusForVisibleAction(this);
  417.       this.rightKey = KeyStroke.getKeyStroke(39, 0);
  418.       this.kpRightKey = KeyStroke.getKeyStroke("KP_RIGHT");
  419.       this.tabPane.registerKeyboardAction(var1, this.rightKey, 0);
  420.       this.tabPane.registerKeyboardAction(var1, this.kpRightKey, 0);
  421.       this.leftKey = KeyStroke.getKeyStroke(37, 0);
  422.       this.kpLeftKey = KeyStroke.getKeyStroke("KP_LEFT");
  423.       this.tabPane.registerKeyboardAction(var2, this.leftKey, 0);
  424.       this.tabPane.registerKeyboardAction(var2, this.kpLeftKey, 0);
  425.       this.upKey = KeyStroke.getKeyStroke(38, 0);
  426.       this.kpUpKey = KeyStroke.getKeyStroke("KP_UP");
  427.       this.tabPane.registerKeyboardAction(var3, this.upKey, 0);
  428.       this.tabPane.registerKeyboardAction(var3, this.kpUpKey, 0);
  429.       this.downKey = KeyStroke.getKeyStroke(40, 0);
  430.       this.kpDownKey = KeyStroke.getKeyStroke("KP_DOWN");
  431.       this.tabPane.registerKeyboardAction(var4, this.downKey, 0);
  432.       this.tabPane.registerKeyboardAction(var4, this.kpDownKey, 0);
  433.       this.tabPane.registerKeyboardAction(var6, KeyStroke.getKeyStroke(34, 2), 1);
  434.       this.tabPane.registerKeyboardAction(var5, KeyStroke.getKeyStroke(33, 2), 1);
  435.       this.tabPane.registerKeyboardAction(var7, KeyStroke.getKeyStroke(38, 2), 1);
  436.       this.tabPane.registerKeyboardAction(var7, KeyStroke.getKeyStroke("control KP_UP"), 1);
  437.       this.tabPane.registerKeyboardAction(var8, KeyStroke.getKeyStroke(40, 2), 0);
  438.       this.tabPane.registerKeyboardAction(var8, KeyStroke.getKeyStroke("control KP_DOWN"), 0);
  439.    }
  440.  
  441.    protected void installListeners() {
  442.       if ((this.propertyChangeListener = this.createPropertyChangeListener()) != null) {
  443.          this.tabPane.addPropertyChangeListener(this.propertyChangeListener);
  444.       }
  445.  
  446.       if ((this.tabChangeListener = this.createChangeListener()) != null) {
  447.          this.tabPane.addChangeListener(this.tabChangeListener);
  448.       }
  449.  
  450.       if ((this.mouseListener = this.createMouseListener()) != null) {
  451.          this.tabPane.addMouseListener(this.mouseListener);
  452.       }
  453.  
  454.       if ((this.focusListener = this.createFocusListener()) != null) {
  455.          this.tabPane.addFocusListener(this.focusListener);
  456.       }
  457.  
  458.       if ((this.containerListener = new ContainerHandler(this)) != null) {
  459.          this.tabPane.addContainerListener(this.containerListener);
  460.          if (this.tabPane.getTabCount() > 0) {
  461.             this.htmlViews = this.createHTMLVector();
  462.          }
  463.       }
  464.  
  465.    }
  466.  
  467.    public void installUI(JComponent var1) {
  468.       this.tabPane = (JTabbedPane)var1;
  469.       ((Container)var1).setLayout(this.createLayoutManager());
  470.       this.installDefaults();
  471.       this.installListeners();
  472.       this.installKeyboardActions();
  473.       this.runCount = 0;
  474.       this.selectedRun = -1;
  475.    }
  476.  
  477.    protected int lastTabInRun(int var1, int var2) {
  478.       if (this.runCount == 1) {
  479.          return var1 - 1;
  480.       } else {
  481.          int var3 = var2 == this.runCount - 1 ? 0 : var2 + 1;
  482.          return this.tabRuns[var3] == 0 ? var1 - 1 : this.tabRuns[var3] - 1;
  483.       }
  484.    }
  485.  
  486.    protected void layoutLabel(int var1, FontMetrics var2, int var3, String var4, Icon var5, Rectangle var6, Rectangle var7, Rectangle var8, boolean var9) {
  487.       var8.x = var8.y = var7.x = var7.y = 0;
  488.       SwingUtilities.layoutCompoundLabel(this.tabPane, var2, var4, var5, 0, 0, 0, 4, var6, var7, var8, this.textIconGap);
  489.       int var10 = this.getTabLabelShiftX(var1, var3, var9);
  490.       int var11 = this.getTabLabelShiftY(var1, var3, var9);
  491.       var7.x += var10;
  492.       var7.y += var11;
  493.       var8.x += var10;
  494.       var8.y += var11;
  495.    }
  496.  
  497.    protected void navigateSelectedTab(int var1) {
  498.       int var2 = this.tabPane.getTabPlacement();
  499.       int var3 = this.tabPane.getSelectedIndex();
  500.       int var4 = this.tabPane.getTabCount();
  501.       switch (var2) {
  502.          case 1:
  503.          case 3:
  504.          default:
  505.             switch (var1) {
  506.                case 1:
  507.                   int var8 = this.getTabRunOffset(var2, var4, var3, false);
  508.                   this.selectAdjacentRunTab(var2, var3, var8);
  509.                   return;
  510.                case 2:
  511.                case 4:
  512.                case 6:
  513.                default:
  514.                   return;
  515.                case 3:
  516.                   this.selectNextTab(var3);
  517.                   return;
  518.                case 5:
  519.                   int var7 = this.getTabRunOffset(var2, var4, var3, true);
  520.                   this.selectAdjacentRunTab(var2, var3, var7);
  521.                   return;
  522.                case 7:
  523.                   this.selectPreviousTab(var3);
  524.                   return;
  525.             }
  526.          case 2:
  527.          case 4:
  528.             switch (var1) {
  529.                case 1:
  530.                   this.selectPreviousTab(var3);
  531.                case 2:
  532.                case 4:
  533.                case 6:
  534.                default:
  535.                   break;
  536.                case 3:
  537.                   int var6 = this.getTabRunOffset(var2, var4, var3, true);
  538.                   this.selectAdjacentRunTab(var2, var3, var6);
  539.                   break;
  540.                case 5:
  541.                   this.selectNextTab(var3);
  542.                   break;
  543.                case 7:
  544.                   int var5 = this.getTabRunOffset(var2, var4, var3, false);
  545.                   this.selectAdjacentRunTab(var2, var3, var5);
  546.             }
  547.       }
  548.  
  549.    }
  550.  
  551.    public void paint(Graphics var1, JComponent var2) {
  552.       int var3 = this.tabPane.getSelectedIndex();
  553.       int var4 = this.tabPane.getTabPlacement();
  554.       int var5 = this.tabPane.getTabCount();
  555.       this.ensureCurrentLayout();
  556.       Rectangle var6 = new Rectangle();
  557.       Rectangle var7 = new Rectangle();
  558.       Rectangle var8 = var1.getClipBounds();
  559.       Insets var9 = this.tabPane.getInsets();
  560.  
  561.       for(int var10 = this.runCount - 1; var10 >= 0; --var10) {
  562.          int var11 = this.tabRuns[var10];
  563.          int var12 = this.tabRuns[var10 == this.runCount - 1 ? 0 : var10 + 1];
  564.          int var13 = var12 != 0 ? var12 - 1 : var5 - 1;
  565.  
  566.          for(int var14 = var11; var14 <= var13; ++var14) {
  567.             if (this.rects[var14].intersects(var8)) {
  568.                this.paintTab(var1, var4, this.rects, var14, var6, var7);
  569.             }
  570.          }
  571.       }
  572.  
  573.       if (var3 >= 0 && this.getRunForTab(var5, var3) == 0 && this.rects[var3].intersects(var8)) {
  574.          this.paintTab(var1, var4, this.rects, var3, var6, var7);
  575.       }
  576.  
  577.       this.paintContentBorder(var1, var4, var3);
  578.    }
  579.  
  580.    protected void paintContentBorder(Graphics var1, int var2, int var3) {
  581.       int var4 = this.tabPane.getWidth();
  582.       int var5 = this.tabPane.getHeight();
  583.       Insets var6 = this.tabPane.getInsets();
  584.       int var7 = var6.left;
  585.       int var8 = var6.top;
  586.       int var9 = var4 - var6.right - var6.left;
  587.       int var10 = var5 - var6.top - var6.bottom;
  588.       switch (var2) {
  589.          case 1:
  590.          default:
  591.             var8 += this.calculateTabAreaHeight(var2, this.runCount, this.maxTabHeight);
  592.             var10 -= var8 - var6.top;
  593.             break;
  594.          case 2:
  595.             var7 += this.calculateTabAreaWidth(var2, this.runCount, this.maxTabWidth);
  596.             var9 -= var7 - var6.left;
  597.             break;
  598.          case 3:
  599.             var10 -= this.calculateTabAreaHeight(var2, this.runCount, this.maxTabHeight);
  600.             break;
  601.          case 4:
  602.             var9 -= this.calculateTabAreaWidth(var2, this.runCount, this.maxTabWidth);
  603.       }
  604.  
  605.       this.paintContentBorderTopEdge(var1, var2, var3, var7, var8, var9, var10);
  606.       this.paintContentBorderLeftEdge(var1, var2, var3, var7, var8, var9, var10);
  607.       this.paintContentBorderBottomEdge(var1, var2, var3, var7, var8, var9, var10);
  608.       this.paintContentBorderRightEdge(var1, var2, var3, var7, var8, var9, var10);
  609.    }
  610.  
  611.    protected void paintContentBorderBottomEdge(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7) {
  612.       var1.setColor(this.shadow);
  613.       if (var2 == 3 && var3 >= 0 && this.rects[var3].y - 1 <= var7) {
  614.          Rectangle var8 = this.rects[var3];
  615.          var1.drawLine(var4 + 1, var5 + var7 - 2, var8.x - 1, var5 + var7 - 2);
  616.          var1.setColor(this.darkShadow);
  617.          var1.drawLine(var4, var5 + var7 - 1, var8.x - 1, var5 + var7 - 1);
  618.          if (var8.x + var8.width < var4 + var6 - 2) {
  619.             var1.setColor(this.shadow);
  620.             var1.drawLine(var8.x + var8.width, var5 + var7 - 2, var4 + var6 - 2, var5 + var7 - 2);
  621.             var1.setColor(this.darkShadow);
  622.             var1.drawLine(var8.x + var8.width, var5 + var7 - 1, var4 + var6 - 1, var5 + var7 - 1);
  623.          }
  624.       } else {
  625.          var1.drawLine(var4 + 1, var5 + var7 - 2, var4 + var6 - 2, var5 + var7 - 2);
  626.          var1.setColor(this.darkShadow);
  627.          var1.drawLine(var4, var5 + var7 - 1, var4 + var6 - 1, var5 + var7 - 1);
  628.       }
  629.  
  630.    }
  631.  
  632.    protected void paintContentBorderLeftEdge(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7) {
  633.       var1.setColor(this.lightHighlight);
  634.       if (var2 == 2 && var3 >= 0 && this.rects[var3].x + this.rects[var3].width + 1 >= var4) {
  635.          Rectangle var8 = this.rects[var3];
  636.          var1.drawLine(var4, var5, var4, var8.y - 1);
  637.          if (var8.y + var8.height < var5 + var7 - 2) {
  638.             var1.drawLine(var4, var8.y + var8.height, var4, var5 + var7 - 2);
  639.          }
  640.       } else {
  641.          var1.drawLine(var4, var5, var4, var5 + var7 - 2);
  642.       }
  643.  
  644.    }
  645.  
  646.    protected void paintContentBorderRightEdge(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7) {
  647.       var1.setColor(this.shadow);
  648.       if (var2 == 4 && var3 >= 0 && this.rects[var3].x - 1 <= var6) {
  649.          Rectangle var8 = this.rects[var3];
  650.          var1.drawLine(var4 + var6 - 2, var5 + 1, var4 + var6 - 2, var8.y - 1);
  651.          var1.setColor(this.darkShadow);
  652.          var1.drawLine(var4 + var6 - 1, var5, var4 + var6 - 1, var8.y - 1);
  653.          if (var8.y + var8.height < var5 + var7 - 2) {
  654.             var1.setColor(this.shadow);
  655.             var1.drawLine(var4 + var6 - 2, var8.y + var8.height, var4 + var6 - 2, var5 + var7 - 2);
  656.             var1.setColor(this.darkShadow);
  657.             var1.drawLine(var4 + var6 - 1, var8.y + var8.height, var4 + var6 - 1, var5 + var7 - 2);
  658.          }
  659.       } else {
  660.          var1.drawLine(var4 + var6 - 2, var5 + 1, var4 + var6 - 2, var5 + var7 - 3);
  661.          var1.setColor(this.darkShadow);
  662.          var1.drawLine(var4 + var6 - 1, var5, var4 + var6 - 1, var5 + var7 - 1);
  663.       }
  664.  
  665.    }
  666.  
  667.    protected void paintContentBorderTopEdge(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7) {
  668.       var1.setColor(this.lightHighlight);
  669.       if (var2 == 1 && var3 >= 0 && this.rects[var3].y + this.rects[var3].height + 1 >= var5) {
  670.          Rectangle var8 = this.rects[var3];
  671.          var1.drawLine(var4, var5, var8.x - 1, var5);
  672.          if (var8.x + var8.width < var4 + var6 - 2) {
  673.             var1.drawLine(var8.x + var8.width, var5, var4 + var6 - 2, var5);
  674.          } else {
  675.             var1.setColor(this.shadow);
  676.             var1.drawLine(var4 + var6 - 2, var5, var4 + var6 - 2, var5);
  677.          }
  678.       } else {
  679.          var1.drawLine(var4, var5, var4 + var6 - 2, var5);
  680.       }
  681.  
  682.    }
  683.  
  684.    protected void paintFocusIndicator(Graphics var1, int var2, Rectangle[] var3, int var4, Rectangle var5, Rectangle var6, boolean var7) {
  685.       Rectangle var8 = var3[var4];
  686.       if (this.tabPane.hasFocus() && var7) {
  687.          var1.setColor(this.focus);
  688.          int var9;
  689.          int var10;
  690.          int var11;
  691.          int var12;
  692.          switch (var2) {
  693.             case 1:
  694.             default:
  695.                var9 = var8.x + 3;
  696.                var10 = var8.y + 3;
  697.                var11 = var8.width - 6;
  698.                var12 = var8.height - 5;
  699.                break;
  700.             case 2:
  701.                var9 = var8.x + 3;
  702.                var10 = var8.y + 3;
  703.                var11 = var8.width - 5;
  704.                var12 = var8.height - 6;
  705.                break;
  706.             case 3:
  707.                var9 = var8.x + 3;
  708.                var10 = var8.y + 2;
  709.                var11 = var8.width - 6;
  710.                var12 = var8.height - 5;
  711.                break;
  712.             case 4:
  713.                var9 = var8.x + 2;
  714.                var10 = var8.y + 3;
  715.                var11 = var8.width - 5;
  716.                var12 = var8.height - 6;
  717.          }
  718.  
  719.          BasicGraphicsUtils.drawDashedRect(var1, var9, var10, var11, var12);
  720.       }
  721.  
  722.    }
  723.  
  724.    protected void paintIcon(Graphics var1, int var2, int var3, Icon var4, Rectangle var5, boolean var6) {
  725.       if (var4 != null) {
  726.          var4.paintIcon(this.tabPane, var1, var5.x, var5.y);
  727.       }
  728.  
  729.    }
  730.  
  731.    protected void paintTab(Graphics var1, int var2, Rectangle[] var3, int var4, Rectangle var5, Rectangle var6) {
  732.       Rectangle var7 = var3[var4];
  733.       int var8 = this.tabPane.getSelectedIndex();
  734.       boolean var9 = var8 == var4;
  735.       this.paintTabBackground(var1, var2, var4, var7.x, var7.y, var7.width, var7.height, var9);
  736.       this.paintTabBorder(var1, var2, var4, var7.x, var7.y, var7.width, var7.height, var9);
  737.       String var10 = this.tabPane.getTitleAt(var4);
  738.       Font var11 = this.tabPane.getFont();
  739.       FontMetrics var12 = var1.getFontMetrics(var11);
  740.       Icon var13 = this.getIconForTab(var4);
  741.       this.layoutLabel(var2, var12, var4, var10, var13, var7, var5, var6, var9);
  742.       this.paintText(var1, var2, var11, var12, var4, var10, var6, var9);
  743.       this.paintIcon(var1, var2, var4, var13, var5, var9);
  744.       this.paintFocusIndicator(var1, var2, var3, var4, var5, var6, var9);
  745.    }
  746.  
  747.    protected void paintTabBackground(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7, boolean var8) {
  748.       var1.setColor(this.tabPane.getBackgroundAt(var3));
  749.       switch (var2) {
  750.          case 1:
  751.          default:
  752.             var1.fillRect(var4 + 1, var5 + 1, var6 - 3, var7 - 1);
  753.             break;
  754.          case 2:
  755.             var1.fillRect(var4 + 1, var5 + 1, var6 - 2, var7 - 3);
  756.             break;
  757.          case 3:
  758.             var1.fillRect(var4 + 1, var5, var6 - 3, var7 - 1);
  759.             break;
  760.          case 4:
  761.             var1.fillRect(var4, var5 + 1, var6 - 2, var7 - 3);
  762.       }
  763.  
  764.    }
  765.  
  766.    protected void paintTabBorder(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7, boolean var8) {
  767.       var1.setColor(this.lightHighlight);
  768.       switch (var2) {
  769.          case 1:
  770.          default:
  771.             var1.drawLine(var4, var5 + 2, var4, var5 + var7 - 1);
  772.             var1.drawLine(var4 + 1, var5 + 1, var4 + 1, var5 + 1);
  773.             var1.drawLine(var4 + 2, var5, var4 + var6 - 3, var5);
  774.             var1.setColor(this.shadow);
  775.             var1.drawLine(var4 + var6 - 2, var5 + 2, var4 + var6 - 2, var5 + var7 - 1);
  776.             var1.setColor(this.darkShadow);
  777.             var1.drawLine(var4 + var6 - 1, var5 + 2, var4 + var6 - 1, var5 + var7 - 1);
  778.             var1.drawLine(var4 + var6 - 2, var5 + 1, var4 + var6 - 2, var5 + 1);
  779.             break;
  780.          case 2:
  781.             var1.drawLine(var4 + 1, var5 + var7 - 2, var4 + 1, var5 + var7 - 2);
  782.             var1.drawLine(var4, var5 + 2, var4, var5 + var7 - 3);
  783.             var1.drawLine(var4 + 1, var5 + 1, var4 + 1, var5 + 1);
  784.             var1.drawLine(var4 + 2, var5, var4 + var6 - 1, var5);
  785.             var1.setColor(this.shadow);
  786.             var1.drawLine(var4 + 2, var5 + var7 - 2, var4 + var6 - 1, var5 + var7 - 2);
  787.             var1.setColor(this.darkShadow);
  788.             var1.drawLine(var4 + 2, var5 + var7 - 1, var4 + var6 - 1, var5 + var7 - 1);
  789.             break;
  790.          case 3:
  791.             var1.drawLine(var4, var5, var4, var5 + var7 - 3);
  792.             var1.drawLine(var4 + 1, var5 + var7 - 2, var4 + 1, var5 + var7 - 2);
  793.             var1.setColor(this.shadow);
  794.             var1.drawLine(var4 + 2, var5 + var7 - 2, var4 + var6 - 3, var5 + var7 - 2);
  795.             var1.drawLine(var4 + var6 - 2, var5, var4 + var6 - 2, var5 + var7 - 3);
  796.             var1.setColor(this.darkShadow);
  797.             var1.drawLine(var4 + 2, var5 + var7 - 1, var4 + var6 - 3, var5 + var7 - 1);
  798.             var1.drawLine(var4 + var6 - 2, var5 + var7 - 2, var4 + var6 - 2, var5 + var7 - 2);
  799.             var1.drawLine(var4 + var6 - 1, var5, var4 + var6 - 1, var5 + var7 - 3);
  800.             break;
  801.          case 4:
  802.             var1.drawLine(var4, var5, var4 + var6 - 3, var5);
  803.             var1.setColor(this.shadow);
  804.             var1.drawLine(var4, var5 + var7 - 2, var4 + var6 - 3, var5 + var7 - 2);
  805.             var1.drawLine(var4 + var6 - 2, var5 + 2, var4 + var6 - 2, var5 + var7 - 3);
  806.             var1.setColor(this.darkShadow);
  807.             var1.drawLine(var4 + var6 - 2, var5 + 1, var4 + var6 - 2, var5 + 1);
  808.             var1.drawLine(var4 + var6 - 2, var5 + var7 - 2, var4 + var6 - 2, var5 + var7 - 2);
  809.             var1.drawLine(var4 + var6 - 1, var5 + 2, var4 + var6 - 1, var5 + var7 - 3);
  810.             var1.drawLine(var4, var5 + var7 - 1, var4 + var6 - 3, var5 + var7 - 1);
  811.       }
  812.  
  813.    }
  814.  
  815.    protected void paintText(Graphics var1, int var2, Font var3, FontMetrics var4, int var5, String var6, Rectangle var7, boolean var8) {
  816.       var1.setFont(var3);
  817.       View var9;
  818.       if (this.htmlViews != null && (var9 = (View)this.htmlViews.elementAt(var5)) != null) {
  819.          var9.paint(var1, var7);
  820.       } else if (this.tabPane.isEnabled() && this.tabPane.isEnabledAt(var5)) {
  821.          var1.setColor(this.tabPane.getForegroundAt(var5));
  822.          var1.drawString(var6, var7.x, var7.y + var4.getAscent());
  823.       } else {
  824.          var1.setColor(this.tabPane.getBackgroundAt(var5).brighter());
  825.          var1.drawString(var6, var7.x, var7.y + var4.getAscent());
  826.          var1.setColor(this.tabPane.getBackgroundAt(var5).darker());
  827.          var1.drawString(var6, var7.x - 1, var7.y + var4.getAscent() - 1);
  828.       }
  829.  
  830.    }
  831.  
  832.    boolean requestFocusForVisibleComponent() {
  833.       Component var1 = this.getVisibleComponent();
  834.       if (var1.isFocusTraversable()) {
  835.          var1.requestFocus();
  836.          return true;
  837.       } else {
  838.          return var1 instanceof JComponent && ((JComponent)var1).requestDefaultFocus();
  839.       }
  840.    }
  841.  
  842.    protected static void rotateInsets(Insets var0, Insets var1, int var2) {
  843.       switch (var2) {
  844.          case 1:
  845.          default:
  846.             var1.top = var0.top;
  847.             var1.left = var0.left;
  848.             var1.bottom = var0.bottom;
  849.             var1.right = var0.right;
  850.             break;
  851.          case 2:
  852.             var1.top = var0.right;
  853.             var1.left = var0.top;
  854.             var1.bottom = var0.left;
  855.             var1.right = var0.bottom;
  856.             break;
  857.          case 3:
  858.             var1.top = var0.bottom;
  859.             var1.left = var0.right;
  860.             var1.bottom = var0.top;
  861.             var1.right = var0.left;
  862.             break;
  863.          case 4:
  864.             var1.top = var0.left;
  865.             var1.left = var0.bottom;
  866.             var1.bottom = var0.right;
  867.             var1.right = var0.top;
  868.       }
  869.  
  870.    }
  871.  
  872.    protected void selectAdjacentRunTab(int var1, int var2, int var3) {
  873.       if (this.runCount >= 2) {
  874.          Rectangle var5 = this.rects[var2];
  875.          int var4;
  876.          switch (var1) {
  877.             case 1:
  878.             case 3:
  879.             default:
  880.                var4 = this.tabForCoordinate(this.tabPane, var5.x + var5.width / 2, var5.y + var5.height / 2 + var3);
  881.                break;
  882.             case 2:
  883.             case 4:
  884.                var4 = this.tabForCoordinate(this.tabPane, var5.x + var5.width / 2 + var3, var5.y + var5.height / 2);
  885.          }
  886.  
  887.          if (var4 != -1) {
  888.             while(!this.tabPane.isEnabledAt(var4) && var4 != var2) {
  889.                var4 = this.getNextTabIndex(var4);
  890.             }
  891.  
  892.             this.tabPane.setSelectedIndex(var4);
  893.          }
  894.  
  895.       }
  896.    }
  897.  
  898.    protected void selectNextTab(int var1) {
  899.       int var2;
  900.       for(var2 = this.getNextTabIndex(var1); var2 != var1 && !this.tabPane.isEnabledAt(var2); var2 = this.getNextTabIndex(var2)) {
  901.       }
  902.  
  903.       this.tabPane.setSelectedIndex(var2);
  904.    }
  905.  
  906.    protected void selectPreviousTab(int var1) {
  907.       int var2;
  908.       for(var2 = this.getPreviousTabIndex(var1); var2 != var1 && !this.tabPane.isEnabledAt(var2); var2 = this.getPreviousTabIndex(var2)) {
  909.       }
  910.  
  911.       this.tabPane.setSelectedIndex(var2);
  912.    }
  913.  
  914.    protected void setVisibleComponent(Component var1) {
  915.       if (this.visibleComponent != var1) {
  916.          if (this.visibleComponent != null) {
  917.             this.visibleComponent.setVisible(false);
  918.          }
  919.  
  920.          if (var1 != null) {
  921.             var1.setVisible(true);
  922.          }
  923.  
  924.          this.visibleComponent = var1;
  925.       }
  926.    }
  927.  
  928.    protected boolean shouldPadTabRun(int var1, int var2) {
  929.       return this.runCount > 1;
  930.    }
  931.  
  932.    protected boolean shouldRotateTabRuns(int var1) {
  933.       return true;
  934.    }
  935.  
  936.    public int tabForCoordinate(JTabbedPane var1, int var2, int var3) {
  937.       int var4 = this.tabPane.getTabCount();
  938.  
  939.       for(int var5 = 0; var5 < var4; ++var5) {
  940.          if (this.rects[var5].contains(var2, var3)) {
  941.             return var5;
  942.          }
  943.       }
  944.  
  945.       return -1;
  946.    }
  947.  
  948.    protected void uninstallDefaults() {
  949.       this.highlight = null;
  950.       this.lightHighlight = null;
  951.       this.shadow = null;
  952.       this.darkShadow = null;
  953.       this.focus = null;
  954.       this.tabInsets = null;
  955.       this.selectedTabPadInsets = null;
  956.       this.tabAreaInsets = null;
  957.       this.contentBorderInsets = null;
  958.    }
  959.  
  960.    protected void uninstallKeyboardActions() {
  961.       this.tabPane.unregisterKeyboardAction(this.upKey);
  962.       this.tabPane.unregisterKeyboardAction(this.downKey);
  963.       this.tabPane.unregisterKeyboardAction(this.leftKey);
  964.       this.tabPane.unregisterKeyboardAction(this.rightKey);
  965.       this.tabPane.unregisterKeyboardAction(this.kpUpKey);
  966.       this.tabPane.unregisterKeyboardAction(this.kpDownKey);
  967.       this.tabPane.unregisterKeyboardAction(this.kpLeftKey);
  968.       this.tabPane.unregisterKeyboardAction(this.kpRightKey);
  969.       this.upKey = this.downKey = this.rightKey = this.leftKey = this.kpUpKey = this.kpDownKey = this.kpRightKey = this.kpLeftKey = null;
  970.       this.tabPane.unregisterKeyboardAction(KeyStroke.getKeyStroke(34, 2));
  971.       this.tabPane.unregisterKeyboardAction(KeyStroke.getKeyStroke(33, 2));
  972.       this.tabPane.unregisterKeyboardAction(KeyStroke.getKeyStroke(40, 2));
  973.       this.tabPane.unregisterKeyboardAction(KeyStroke.getKeyStroke(38, 2));
  974.       this.tabPane.unregisterKeyboardAction(KeyStroke.getKeyStroke("control KP_DOWN"));
  975.       this.tabPane.unregisterKeyboardAction(KeyStroke.getKeyStroke("control KP_UP"));
  976.    }
  977.  
  978.    protected void uninstallListeners() {
  979.       if (this.mouseListener != null) {
  980.          this.tabPane.removeMouseListener(this.mouseListener);
  981.          this.mouseListener = null;
  982.       }
  983.  
  984.       if (this.focusListener != null) {
  985.          this.tabPane.removeFocusListener(this.focusListener);
  986.          this.focusListener = null;
  987.       }
  988.  
  989.       if (this.containerListener != null) {
  990.          this.tabPane.removeContainerListener(this.containerListener);
  991.          this.containerListener = null;
  992.          if (this.htmlViews != null) {
  993.             this.htmlViews.removeAllElements();
  994.             this.htmlViews = null;
  995.          }
  996.       }
  997.  
  998.       if (this.tabChangeListener != null) {
  999.          this.tabPane.removeChangeListener(this.tabChangeListener);
  1000.          this.tabChangeListener = null;
  1001.       }
  1002.  
  1003.       if (this.propertyChangeListener != null) {
  1004.          this.tabPane.removePropertyChangeListener(this.propertyChangeListener);
  1005.          this.propertyChangeListener = null;
  1006.       }
  1007.  
  1008.    }
  1009.  
  1010.    public void uninstallUI(JComponent var1) {
  1011.       this.uninstallKeyboardActions();
  1012.       this.uninstallListeners();
  1013.       this.uninstallDefaults();
  1014.       ((Container)var1).setLayout((LayoutManager)null);
  1015.       this.tabPane = null;
  1016.    }
  1017. }
  1018.